#if !defined(__ASYNC_IO_H__)
#    define __ASYNC_IO_H__

#    include <arpa/inet.h>
#    include <errno.h>
#    include <fcntl.h>
#    include <netinet/in.h>
#    include <signal.h>
#    include <stdbool.h>
#    include <stdio.h>
#    include <stdlib.h>
#    include <string.h>
#    include <sys/epoll.h>
#    include <sys/socket.h>
#    include <sys/types.h>
#    include <time.h>
#    include <unistd.h>

__BEGIN_DECLS
typedef int (*AsyncCallback)(int fd, uint32_t events);
typedef int (*AsyncReadCallback)(int fd, int read_size, void* data);
typedef int (*AsyncAcceptCallback)(int clean_fd, struct sockaddr_in client_addr);
typedef int (*AsyncWriteCallback)(int fd, int write_size);

/// @brief 初始化异步 I/O 环境
/// @param  
/// @return 
int async_init(void);

/// @brief 销毁异步 I/O 环境，释放资源
/// @param  
/// @return 
int async_exit(void);

/// @brief 异步读取数据函数，读取完成后调用回调函数
/// @param fd 文件描述符
/// @param buff 存储读取数据的缓冲区指针
/// @param buff_size 缓冲区大小
/// @param callback 读取完成后的回调函数指针
/// @return  成功：0 失败：-1
int async_read(int fd, void* buff, size_t buff_size, AsyncReadCallback callback);

/// @brief 异步写入数据函数，写入完成后调用回调函数
/// @param fd 文件描述符，用于标识要写入数据的文件
/// @param data 要写入的数据指针，指向要写入文件的数据缓冲区
/// @param data_size 数据大小，表示要写入的数据的字节数
/// @param callback 写入完成后的回调函数指针，用于在写入完成后执行自定义的回调操作
/// @return 成功：0 失败：-1
int async_write(int fd, const void* data, size_t data_size, AsyncWriteCallback callback);

/// @brief 异步接受连接函数，接受连接后调用回调函数
/// @param fd 监听套接字
/// @param callback 连接接受完成后的回调函数指针
/// @return 成功：0 失败：-1
int async_accept(int fd, AsyncAcceptCallback callback);

/// @brief 处理文件描述符上的 EPOLLERR 事件，当文件描述符发生错误时触发回调函数
/// @param fd 文件描述符
/// @param callback 错误处理的回调函数指针，用于在发生错误时执行自定义的错误处理操作
/// @return 成功：0 失败：-1
int async_error(int fd, AsyncCallback callback);

/// @brief 处理文件描述符上的 EPOLLRDHUP 事件，当 TCP 连接的读半部分关闭时触发回调函数
/// @param fd 文件描述符
/// @param callback 错误处理的回调函数指针，用于在发生错误时执行自定义的错误处理操作
/// @return 成功：0 失败：-1
int async_rdhup(int fd, AsyncCallback callback);

/// @brief 处理文件描述符上的 EPOLLHUP 事件，当文件描述符被挂起时触发回调函数
/// @param fd 文件描述符
/// @param callback 错误处理的回调函数指针，用于在发生错误时执行自定义的错误处理操作
/// @return 成功：0 失败：-1
int async_hup(int fd, AsyncCallback callback);

/// @brief 异步事件循环函数，不断监听和处理异步 I/O 操作的完成
/// @return
int async_exec(void);

__END_DECLS
#endif  // __ASYNC_IO_H__
